home *** CD-ROM | disk | FTP | other *** search
/ The Arsenal Files 8 / The Arsenal Files Collection #8 (Arsenal Computer) (1996).ISO / g_quake / anticamp.zip / MISC.QC < prev    next >
Text File  |  1996-10-02  |  17KB  |  718 lines

  1.  
  2. /*QUAKED info_null (0 0.5 0) (-4 -4 -4) (4 4 4)
  3. Used as a positional target for spotlights, etc.
  4. */
  5.  
  6. //#Harlequin#  Sniper detector spawn function.
  7. void() info_null =
  8. {
  9.     if ((deathmatch != 1) || (self.targetname != "sniper_detector"))
  10.     {
  11.         remove(self);
  12.         return;
  13.     }
  14.  
  15.     precache_sound("ogre/ogwake.wav"); //#Harlequin#  Sniper-warning sound
  16.     self.think = EntityFindSnipers;
  17.     self.nextthink = time + random() + random() + random() + random();
  18.  
  19. //#Harlequin#  Set default field values
  20.     if (self.message == "")
  21.         self.message = "SNIPER DETECTOR";
  22.     if (!self.speed)
  23.         self.speed = 800;
  24.     if (!self.count)
  25.         self.count = 250;
  26.     if (!self.dmg)
  27.         self.dmg = 8;
  28. };
  29.  
  30. //#Harlequin#  Also entities with classname "sniper_detector" will work
  31. void() sniper_detector =
  32. {
  33.     if ((deathmatch != 1) || (self.targetname != "sniper_detector"))
  34.     {
  35.         remove(self);
  36.         return;
  37.     }
  38.  
  39.     precache_sound("ogre/ogwake.wav");
  40.     self.think = EntityFindSnipers;
  41.     self.nextthink = time + random() + random() + random() + random();
  42.  
  43.     if (self.message == "")
  44.         self.message = "SNIPER DETECTOR";
  45.     if (!self.speed)
  46.         self.speed = 800;
  47.     if (!self.count)
  48.         self.count = 250;
  49.     if (!self.dmg)
  50.         self.dmg = 8;
  51. };
  52. //#Harlequin#  End of my mods in this section
  53.  
  54.  
  55. /*QUAKED info_notnull (0 0.5 0) (-4 -4 -4) (4 4 4)
  56. Used as a positional target for lightning.
  57. */
  58. void() info_notnull =
  59. {
  60. };
  61.  
  62. //============================================================================
  63.  
  64. float START_OFF = 1;
  65.  
  66. void() light_use =
  67. {
  68.     if (self.spawnflags & START_OFF)
  69.     {
  70.         lightstyle(self.style, "m");
  71.         self.spawnflags = self.spawnflags - START_OFF;
  72.     }
  73.     else
  74.     {
  75.         lightstyle(self.style, "a");
  76.         self.spawnflags = self.spawnflags + START_OFF;
  77.     }
  78. };
  79.  
  80. /*QUAKED light (0 1 0) (-8 -8 -8) (8 8 8) START_OFF
  81. Non-displayed light.
  82. Default light value is 300
  83. Default style is 0
  84. If targeted, it will toggle between on or off.
  85. */
  86. void() light =
  87. {
  88.     if (!self.targetname)
  89.     {    // inert light
  90.         remove(self);
  91.         return;
  92.     }
  93.     
  94.     if (self.style >= 32)
  95.     {
  96.         self.use = light_use;
  97.         if (self.spawnflags & START_OFF)
  98.             lightstyle(self.style, "a");
  99.         else
  100.             lightstyle(self.style, "m");
  101.     }
  102. };
  103.  
  104. /*QUAKED light_fluoro (0 1 0) (-8 -8 -8) (8 8 8) START_OFF
  105. Non-displayed light.
  106. Default light value is 300
  107. Default style is 0
  108. If targeted, it will toggle between on or off.
  109. Makes steady fluorescent humming sound
  110. */
  111. void() light_fluoro =
  112. {
  113.     if (self.style >= 32)
  114.     {
  115.         self.use = light_use;
  116.         if (self.spawnflags & START_OFF)
  117.             lightstyle(self.style, "a");
  118.         else
  119.             lightstyle(self.style, "m");
  120.     }
  121.     
  122.     precache_sound ("ambience/fl_hum1.wav");
  123.     ambientsound (self.origin, "ambience/fl_hum1.wav", 0.5, ATTN_STATIC);
  124. };
  125.  
  126. /*QUAKED light_fluorospark (0 1 0) (-8 -8 -8) (8 8 8)
  127. Non-displayed light.
  128. Default light value is 300
  129. Default style is 10
  130. Makes sparking, broken fluorescent sound
  131. */
  132. void() light_fluorospark =
  133. {
  134.     if (!self.style)
  135.         self.style = 10;
  136.  
  137.     precache_sound ("ambience/buzz1.wav");
  138.     ambientsound (self.origin, "ambience/buzz1.wav", 0.5, ATTN_STATIC);
  139. };
  140.  
  141. /*QUAKED light_globe (0 1 0) (-8 -8 -8) (8 8 8)
  142. Sphere globe light.
  143. Default light value is 300
  144. Default style is 0
  145. */
  146. void() light_globe =
  147. {
  148.     precache_model ("progs/s_light.spr");
  149.     setmodel (self, "progs/s_light.spr");
  150.     makestatic (self);
  151. };
  152.  
  153. void() FireAmbient =
  154. {
  155.     precache_sound ("ambience/fire1.wav");
  156. // attenuate fast
  157.     ambientsound (self.origin, "ambience/fire1.wav", 0.5, ATTN_STATIC);
  158. };
  159.  
  160. /*QUAKED light_torch_small_walltorch (0 .5 0) (-10 -10 -20) (10 10 20)
  161. Short wall torch
  162. Default light value is 200
  163. Default style is 0
  164. */
  165. void() light_torch_small_walltorch =
  166. {
  167.     precache_model ("progs/flame.mdl");
  168.     setmodel (self, "progs/flame.mdl");
  169.     FireAmbient ();
  170.     makestatic (self);
  171. };
  172.  
  173. /*QUAKED light_flame_large_yellow (0 1 0) (-10 -10 -12) (12 12 18)
  174. Large yellow flame ball
  175. */
  176. void() light_flame_large_yellow =
  177. {
  178.     precache_model ("progs/flame2.mdl");
  179.     setmodel (self, "progs/flame2.mdl");
  180.     self.frame = 1;
  181.     FireAmbient ();
  182.     makestatic (self);
  183. };
  184.  
  185. /*QUAKED light_flame_small_yellow (0 1 0) (-8 -8 -8) (8 8 8) START_OFF
  186. Small yellow flame ball
  187. */
  188. void() light_flame_small_yellow =
  189. {
  190.     precache_model ("progs/flame2.mdl");
  191.     setmodel (self, "progs/flame2.mdl");
  192.     FireAmbient ();
  193.     makestatic (self);
  194. };
  195.  
  196. /*QUAKED light_flame_small_white (0 1 0) (-10 -10 -40) (10 10 40) START_OFF
  197. Small white flame ball
  198. */
  199. void() light_flame_small_white =
  200. {
  201.     precache_model ("progs/flame2.mdl");
  202.     setmodel (self, "progs/flame2.mdl");
  203.     FireAmbient ();
  204.     makestatic (self);
  205. };
  206.  
  207. //============================================================================
  208.  
  209.  
  210. /*QUAKED misc_fireball (0 .5 .8) (-8 -8 -8) (8 8 8)
  211. Lava Balls
  212. */
  213.  
  214. void() fire_fly;
  215. void() fire_touch;
  216. void() misc_fireball =
  217. {
  218.     
  219.     precache_model ("progs/lavaball.mdl");
  220.     self.classname = "fireball";
  221.     self.nextthink = time + (random() * 5);
  222.     self.think = fire_fly;
  223.     if (!self.speed)
  224.         self.speed == 1000;
  225. };
  226.  
  227. void() fire_fly =
  228. {
  229. local entity    fireball;
  230.  
  231.     fireball = spawn();
  232.     fireball.solid = SOLID_TRIGGER;
  233.     fireball.movetype = MOVETYPE_TOSS;
  234.     fireball.velocity = '0 0 1000';
  235.     fireball.velocity_x = (random() * 100) - 50;
  236.     fireball.velocity_y = (random() * 100) - 50;
  237.     fireball.velocity_z = self.speed + (random() * 200);
  238.     fireball.classname = "fireball";
  239.     setmodel (fireball, "progs/lavaball.mdl");
  240.     setsize (fireball, '0 0 0', '0 0 0');
  241.     setorigin (fireball, self.origin);
  242.     fireball.nextthink = time + 5;
  243.     fireball.think = SUB_Remove;
  244.     fireball.touch = fire_touch;
  245.     
  246.     self.nextthink = time + (random() * 5) + 3;
  247.     self.think = fire_fly;
  248. };
  249.  
  250.  
  251. void() fire_touch =
  252. {
  253.     T_Damage (other, self, self, 20);
  254.     remove(self);
  255. };
  256.  
  257. //============================================================================
  258.  
  259.  
  260. void() barrel_explode =
  261. {
  262.     self.takedamage = DAMAGE_NO;
  263.     self.classname = "explo_box";
  264.     // did say self.owner
  265.     T_RadiusDamage (self, self, 160, world);
  266.     sound (self, CHAN_VOICE, "weapons/r_exp3.wav", 1, ATTN_NORM);
  267.     particle (self.origin, '0 0 0', 75, 255);
  268.  
  269.     self.origin_z = self.origin_z + 32;
  270.     BecomeExplosion ();
  271. };
  272.  
  273.  
  274.  
  275. /*QUAKED misc_explobox (0 .5 .8) (0 0 0) (32 32 64)
  276. TESTING THING
  277. */
  278.  
  279. void() misc_explobox =
  280. {
  281.     local float    oldz;
  282.     
  283.     self.solid = SOLID_BBOX;
  284.     self.movetype = MOVETYPE_NONE;
  285.     precache_model ("maps/b_explob.bsp");
  286.     setmodel (self, "maps/b_explob.bsp");
  287.     precache_sound ("weapons/r_exp3.wav");
  288.     self.health = 20;
  289.     self.th_die = barrel_explode;
  290.     self.takedamage = DAMAGE_AIM;
  291.  
  292.     self.origin_z = self.origin_z + 2;
  293.     oldz = self.origin_z;
  294.     droptofloor();
  295.     if (oldz - self.origin_z > 250)
  296.     {
  297.         dprint ("item fell out of level at ");
  298.         dprint (vtos(self.origin));
  299.         dprint ("\n");
  300.         remove(self);
  301.     }
  302. };
  303.  
  304.  
  305.  
  306.  
  307. /*QUAKED misc_explobox2 (0 .5 .8) (0 0 0) (32 32 64)
  308. Smaller exploding box, REGISTERED ONLY
  309. */
  310.  
  311. void() misc_explobox2 =
  312. {
  313.     local float    oldz;
  314.     
  315.     self.solid = SOLID_BBOX;
  316.     self.movetype = MOVETYPE_NONE;
  317.     precache_model2 ("maps/b_exbox2.bsp");
  318.     setmodel (self, "maps/b_exbox2.bsp");
  319.     precache_sound ("weapons/r_exp3.wav");
  320.     self.health = 20;
  321.     self.th_die = barrel_explode;
  322.     self.takedamage = DAMAGE_AIM;
  323.  
  324.     self.origin_z = self.origin_z + 2;
  325.     oldz = self.origin_z;
  326.     droptofloor();
  327.     if (oldz - self.origin_z > 250)
  328.     {
  329.         dprint ("item fell out of level at ");
  330.         dprint (vtos(self.origin));
  331.         dprint ("\n");
  332.         remove(self);
  333.     }
  334. };
  335.  
  336. //============================================================================
  337.  
  338. float SPAWNFLAG_SUPERSPIKE    = 1;
  339. float SPAWNFLAG_LASER = 2;
  340.  
  341. void(vector org, vector vec) LaunchLaser;
  342.  
  343. void() spikeshooter_use =
  344. {
  345.     if (self.spawnflags & SPAWNFLAG_LASER)
  346.     {
  347.         sound (self, CHAN_VOICE, "enforcer/enfire.wav", 1, ATTN_NORM);
  348.         LaunchLaser (self.origin, self.movedir);
  349.     }
  350.     else
  351.     {
  352.         sound (self, CHAN_VOICE, "weapons/spike2.wav", 1, ATTN_NORM);
  353.         launch_spike (self.origin, self.movedir);
  354.         newmis.velocity = self.movedir * 500;
  355.         if (self.spawnflags & SPAWNFLAG_SUPERSPIKE)
  356.             newmis.touch = superspike_touch;
  357.     }
  358. };
  359.  
  360. void() shooter_think =
  361. {
  362.     spikeshooter_use ();
  363.     self.nextthink = time + self.wait;
  364.     newmis.velocity = self.movedir * 500;
  365. };
  366.  
  367.  
  368. /*QUAKED trap_spikeshooter (0 .5 .8) (-8 -8 -8) (8 8 8) superspike laser
  369. When triggered, fires a spike in the direction set in QuakeEd.
  370. Laser is only for REGISTERED.
  371. */
  372.  
  373. void() trap_spikeshooter =
  374. {
  375.     SetMovedir ();
  376.     self.use = spikeshooter_use;
  377.     if (self.spawnflags & SPAWNFLAG_LASER)
  378.     {
  379.         precache_model2 ("progs/laser.mdl");
  380.         
  381.         precache_sound2 ("enforcer/enfire.wav");
  382.         precache_sound2 ("enforcer/enfstop.wav");
  383.     }
  384.     else
  385.         precache_sound ("weapons/spike2.wav");
  386. };
  387.  
  388.  
  389. /*QUAKED trap_shooter (0 .5 .8) (-8 -8 -8) (8 8 8) superspike laser
  390. Continuously fires spikes.
  391. "wait" time between spike (1.0 default)
  392. "nextthink" delay before firing first spike, so multiple shooters can be stagered.
  393. */
  394. void() trap_shooter =
  395. {
  396.     trap_spikeshooter ();
  397.     
  398.     if (self.wait == 0)
  399.         self.wait = 1;
  400.     self.nextthink = self.nextthink + self.wait + self.ltime;
  401.     self.think = shooter_think;
  402. };
  403.  
  404.  
  405.  
  406. /*
  407. ===============================================================================
  408.  
  409.  
  410. ===============================================================================
  411. */
  412.  
  413.  
  414. void() make_bubbles;
  415. void() bubble_remove;
  416. void() bubble_bob;
  417.  
  418. /*QUAKED air_bubbles (0 .5 .8) (-8 -8 -8) (8 8 8)
  419.  
  420. testing air bubbles
  421. */
  422.  
  423. void() air_bubbles =
  424.  
  425. {
  426.     if (deathmatch)
  427.     {
  428.         remove (self);
  429.         return;
  430.     }
  431.     precache_model ("progs/s_bubble.spr");
  432.     self.nextthink = time + 1;
  433.     self.think = make_bubbles;
  434. };
  435.  
  436. void() make_bubbles =
  437. {
  438. local entity    bubble;
  439.  
  440.     bubble = spawn();
  441.     setmodel (bubble, "progs/s_bubble.spr");
  442.     setorigin (bubble, self.origin);
  443.     bubble.movetype = MOVETYPE_NOCLIP;
  444.     bubble.solid = SOLID_NOT;
  445.     bubble.velocity = '0 0 15';
  446.     bubble.nextthink = time + 0.5;
  447.     bubble.think = bubble_bob;
  448.     bubble.touch = bubble_remove;
  449.     bubble.classname = "bubble";
  450.     bubble.frame = 0;
  451.     bubble.cnt = 0;
  452.     setsize (bubble, '-8 -8 -8', '8 8 8');
  453.     self.nextthink = time + random() + 0.5;
  454.     self.think = make_bubbles;
  455. };
  456.  
  457. void() bubble_split =
  458. {
  459. local entity    bubble;
  460.     bubble = spawn();
  461.     setmodel (bubble, "progs/s_bubble.spr");
  462.     setorigin (bubble, self.origin);
  463.     bubble.movetype = MOVETYPE_NOCLIP;
  464.     bubble.solid = SOLID_NOT;
  465.     bubble.velocity = self.velocity;
  466.     bubble.nextthink = time + 0.5;
  467.     bubble.think = bubble_bob;
  468.     bubble.touch = bubble_remove;
  469.     bubble.classname = "bubble";
  470.     bubble.frame = 1;
  471.     bubble.cnt = 10;
  472.     setsize (bubble, '-8 -8 -8', '8 8 8');
  473.     self.frame = 1;
  474.     self.cnt = 10;
  475.     if (self.waterlevel != 3)
  476.         remove (self);
  477. };
  478.  
  479. void() bubble_remove =
  480. {
  481.     if (other.classname == self.classname)
  482.     {
  483. //        dprint ("bump");
  484.         return;
  485.     }
  486.     remove(self);
  487. };
  488.  
  489. void() bubble_bob =
  490. {
  491. local float        rnd1, rnd2, rnd3;
  492. local vector    vtmp1, modi;
  493.  
  494.     self.cnt = self.cnt + 1;
  495.     if (self.cnt == 4)
  496.         bubble_split();
  497.     if (self.cnt == 20)
  498.         remove(self);
  499.  
  500.     rnd1 = self.velocity_x + (-10 + (random() * 20));
  501.     rnd2 = self.velocity_y + (-10 + (random() * 20));
  502.     rnd3 = self.velocity_z + 10 + random() * 10;
  503.  
  504.     if (rnd1 > 10)
  505.         rnd1 = 5;
  506.     if (rnd1 < -10)
  507.         rnd1 = -5;
  508.         
  509.     if (rnd2 > 10)
  510.         rnd2 = 5;
  511.     if (rnd2 < -10)
  512.         rnd2 = -5;
  513.         
  514.     if (rnd3 < 10)
  515.         rnd3 = 15;
  516.     if (rnd3 > 30)
  517.         rnd3 = 25;
  518.     
  519.     self.velocity_x = rnd1;
  520.     self.velocity_y = rnd2;
  521.     self.velocity_z = rnd3;
  522.         
  523.     self.nextthink = time + 0.5;
  524.     self.think = bubble_bob;
  525. };
  526.  
  527. /*~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>
  528. ~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~*/
  529.  
  530. /*QUAKED viewthing (0 .5 .8) (-8 -8 -8) (8 8 8)
  531.  
  532. Just for the debugging level.  Don't use
  533. */
  534.  
  535. void() viewthing =
  536.  
  537. {
  538.     self.movetype = MOVETYPE_NONE;
  539.     self.solid = SOLID_NOT;
  540.     precache_model ("progs/player.mdl");
  541.     setmodel (self, "progs/player.mdl");
  542. };
  543.  
  544.  
  545. /*
  546. ==============================================================================
  547.  
  548. SIMPLE BMODELS
  549.  
  550. ==============================================================================
  551. */
  552.  
  553. void() func_wall_use =
  554. {    // change to alternate textures
  555.     self.frame = 1 - self.frame;
  556. };
  557.  
  558. /*QUAKED func_wall (0 .5 .8) ?
  559. This is just a solid wall if not inhibitted
  560. */
  561. void() func_wall =
  562. {
  563.     self.angles = '0 0 0';
  564.     self.movetype = MOVETYPE_PUSH;    // so it doesn't get pushed by anything
  565.     self.solid = SOLID_BSP;
  566.     self.use = func_wall_use;
  567.     setmodel (self, self.model);
  568. };
  569.  
  570.  
  571. /*QUAKED func_illusionary (0 .5 .8) ?
  572. A simple entity that looks solid but lets you walk through it.
  573. */
  574. void() func_illusionary =
  575.  
  576. {
  577.     self.angles = '0 0 0';
  578.     self.movetype = MOVETYPE_NONE;
  579.     self.solid = SOLID_NOT;
  580.     setmodel (self, self.model);
  581.     makestatic ();
  582. };
  583.  
  584. /*QUAKED func_episodegate (0 .5 .8) ? E1 E2 E3 E4
  585. This bmodel will appear if the episode has allready been completed, so players can't reenter it.
  586. */
  587. void() func_episodegate =
  588.  
  589. {
  590.     if (!(serverflags & self.spawnflags))
  591.         return;            // can still enter episode
  592.  
  593.     self.angles = '0 0 0';
  594.     self.movetype = MOVETYPE_PUSH;    // so it doesn't get pushed by anything
  595.     self.solid = SOLID_BSP;
  596.     self.use = func_wall_use;
  597.     setmodel (self, self.model);
  598. };
  599.  
  600. /*QUAKED func_bossgate (0 .5 .8) ?
  601. This bmodel appears unless players have all of the episode sigils.
  602. */
  603. void() func_bossgate =
  604.  
  605. {
  606.     if ( (serverflags & 15) == 15)
  607.         return;        // all episodes completed
  608.     self.angles = '0 0 0';
  609.     self.movetype = MOVETYPE_PUSH;    // so it doesn't get pushed by anything
  610.     self.solid = SOLID_BSP;
  611.     self.use = func_wall_use;
  612.     setmodel (self, self.model);
  613. };
  614.  
  615. //============================================================================
  616. /*QUAKED ambient_suck_wind (0.3 0.1 0.6) (-10 -10 -8) (10 10 8)
  617. */
  618. void() ambient_suck_wind =
  619. {
  620.     precache_sound ("ambience/suck1.wav");
  621.     ambientsound (self.origin, "ambience/suck1.wav", 1, ATTN_STATIC);
  622. };
  623.  
  624. /*QUAKED ambient_drone (0.3 0.1 0.6) (-10 -10 -8) (10 10 8)
  625. */
  626. void() ambient_drone =
  627. {
  628.     precache_sound ("ambience/drone6.wav");
  629.     ambientsound (self.origin, "ambience/drone6.wav", 0.5, ATTN_STATIC);
  630. };
  631.  
  632. /*QUAKED ambient_flouro_buzz (0.3 0.1 0.6) (-10 -10 -8) (10 10 8)
  633. */
  634. void() ambient_flouro_buzz =
  635. {
  636.     precache_sound ("ambience/buzz1.wav");
  637.     ambientsound (self.origin, "ambience/buzz1.wav", 1, ATTN_STATIC);
  638. };
  639. /*QUAKED ambient_drip (0.3 0.1 0.6) (-10 -10 -8) (10 10 8)
  640. */
  641. void() ambient_drip =
  642. {
  643.     precache_sound ("ambience/drip1.wav");
  644.     ambientsound (self.origin, "ambience/drip1.wav", 0.5, ATTN_STATIC);
  645. };
  646. /*QUAKED ambient_comp_hum (0.3 0.1 0.6) (-10 -10 -8) (10 10 8)
  647. */
  648. void() ambient_comp_hum =
  649. {
  650.     precache_sound ("ambience/comp1.wav");
  651.     ambientsound (self.origin, "ambience/comp1.wav", 1, ATTN_STATIC);
  652. };
  653. /*QUAKED ambient_thunder (0.3 0.1 0.6) (-10 -10 -8) (10 10 8)
  654. */
  655. void() ambient_thunder =
  656. {
  657.     precache_sound ("ambience/thunder1.wav");
  658.     ambientsound (self.origin, "ambience/thunder1.wav", 0.5, ATTN_STATIC);
  659. };
  660. /*QUAKED ambient_light_buzz (0.3 0.1 0.6) (-10 -10 -8) (10 10 8)
  661. */
  662. void() ambient_light_buzz =
  663. {
  664.     precache_sound ("ambience/fl_hum1.wav");
  665.     ambientsound (self.origin, "ambience/fl_hum1.wav", 0.5, ATTN_STATIC);
  666. };
  667. /*QUAKED ambient_swamp1 (0.3 0.1 0.6) (-10 -10 -8) (10 10 8)
  668. */
  669. void() ambient_swamp1 =
  670. {
  671.     precache_sound ("ambience/swamp1.wav");
  672.     ambientsound (self.origin, "ambience/swamp1.wav", 0.5, ATTN_STATIC);
  673. };
  674. /*QUAKED ambient_swamp2 (0.3 0.1 0.6) (-10 -10 -8) (10 10 8)
  675. */
  676. void() ambient_swamp2 =
  677. {
  678.     precache_sound ("ambience/swamp2.wav");
  679.     ambientsound (self.origin, "ambience/swamp2.wav", 0.5, ATTN_STATIC);
  680. };
  681.  
  682. //============================================================================
  683.  
  684. void() noise_think =
  685. {
  686.     self.nextthink = time + 0.5;
  687.     sound (self, 1, "enforcer/enfire.wav", 1, ATTN_NORM);
  688.     sound (self, 2, "enforcer/enfstop.wav", 1, ATTN_NORM);
  689.     sound (self, 3, "enforcer/sight1.wav", 1, ATTN_NORM);
  690.     sound (self, 4, "enforcer/sight2.wav", 1, ATTN_NORM);
  691.     sound (self, 5, "enforcer/sight3.wav", 1, ATTN_NORM);
  692.     sound (self, 6, "enforcer/sight4.wav", 1, ATTN_NORM);
  693.     sound (self, 7, "enforcer/pain1.wav", 1, ATTN_NORM);
  694. };
  695.  
  696. /*QUAKED misc_noisemaker (1 0.5 0) (-10 -10 -10) (10 10 10)
  697.  
  698. For optimzation testing, starts a lot of sounds.
  699. */
  700.  
  701. void() misc_noisemaker =
  702.  
  703. {
  704.     precache_sound2 ("enforcer/enfire.wav");
  705.     precache_sound2 ("enforcer/enfstop.wav");
  706.     precache_sound2 ("enforcer/sight1.wav");
  707.     precache_sound2 ("enforcer/sight2.wav");
  708.     precache_sound2 ("enforcer/sight3.wav");
  709.     precache_sound2 ("enforcer/sight4.wav");
  710.     precache_sound2 ("enforcer/pain1.wav");
  711.     precache_sound2 ("enforcer/pain2.wav");
  712.     precache_sound2 ("enforcer/death1.wav");
  713.     precache_sound2 ("enforcer/idle1.wav");
  714.  
  715.     self.nextthink = time + 0.1 + random();
  716.     self.think = noise_think;
  717. };
  718.